/**
 *  @file MMCollisionInt.cpp
 */

// This file is part of Cantera. See License.txt in the top-level directory or
// at https://cantera.org/license.txt for license and copyright information.

#include "MMCollisionInt.h"
#include "cantera/base/utilities.h"
#include "cantera/numerics/polyfit.h"
#include "cantera/base/stringUtils.h"
#include "cantera/base/global.h"

namespace Cantera
{
const int DeltaDegree = 6;

double MMCollisionInt::delta[8] = {0.0, 0.25, 0.50, 0.75, 1.0,
                                   1.5, 2.0, 2.5
                                  };

double MMCollisionInt::quadInterp(double x0, double* x, double* y)
{
    double dx21 = x[1] - x[0];
    double dx32 = x[2] - x[1];
    double dx31 = dx21 + dx32;
    double dy32 = y[2] - y[1];
    double dy21 = y[1] - y[0];
    double a = (dx21*dy32 - dy21*dx32)/(dx21*dx31*dx32);
    return a*(x0 - x[0])*(x0 - x[1]) + (dy21/dx21)*(x0 - x[1]) + y[1];
}

double MMCollisionInt::tstar22[37] = {
    0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
    1.2, 1.4, 1.6, 1.8, 2.0, 2.5, 3.0, 3.5, 4.0,
    5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 14.0, 16.0,
    18.0, 20.0, 25.0, 30.0, 35.0, 40.0, 50.0, 75.0, 100.0
};

double MMCollisionInt::omega22_table[37*8] = {
    4.1005, 4.266,  4.833,  5.742,  6.729,  8.624,  10.34,  11.89,
    3.2626, 3.305,  3.516,  3.914,  4.433,  5.57,   6.637,  7.618,
    2.8399, 2.836,  2.936,  3.168,  3.511,  4.329,  5.126,  5.874,
    2.531,  2.522,  2.586,  2.749,  3.004,  3.64,   4.282,  4.895,
    2.2837, 2.277,  2.329,  2.46,   2.665,  3.187,  3.727,  4.249,
    2.0838, 2.081,  2.13,   2.243,  2.417,  2.862,  3.329,  3.786,
    1.922,  1.924,  1.97,   2.072,  2.225,  2.614,  3.028,  3.435,
    1.7902, 1.795,  1.84,   1.934,  2.07,   2.417,  2.788,  3.156,
    1.6823, 1.689,  1.733,  1.82,   1.944,  2.258,  2.596,  2.933,
    1.5929, 1.601,  1.644,  1.725,  1.838,  2.124,  2.435,  2.746,
    1.4551, 1.465,  1.504,  1.574,  1.67,   1.913,  2.181,  2.451,
    1.3551, 1.365,  1.4,    1.461,  1.544,  1.754,  1.989,  2.228,
    1.28,   1.289,  1.321,  1.374,  1.447,  1.63,   1.838,  2.053,
    1.2219, 1.231,  1.259,  1.306,  1.37,   1.532,  1.718,  1.912,
    1.1757, 1.184,  1.209,  1.251,  1.307,  1.451,  1.618,  1.795,
    1.0933, 1.1,    1.119,  1.15,   1.193,  1.304,  1.435,  1.578,
    1.0388, 1.044,  1.059,  1.083,  1.117,  1.204,  1.31,   1.428,
    0.99963, 1.004, 1.016,  1.035,  1.062,  1.133,  1.22,   1.319,
    0.96988, 0.9732, 0.983,  0.9991, 1.021,  1.079,  1.153,  1.236,
    0.92676, 0.9291, 0.936,  0.9473, 0.9628, 1.005,  1.058,  1.121,
    0.89616, 0.8979, 0.903,  0.9114, 0.923,  0.9545, 0.9955, 1.044,
    0.87272, 0.8741, 0.878,  0.8845, 0.8935, 0.9181, 0.9505, 0.9893,
    0.85379, 0.8549, 0.858,  0.8632, 0.8703, 0.8901, 0.9164, 0.9482,
    0.83795, 0.8388, 0.8414, 0.8456, 0.8515, 0.8678, 0.8895, 0.916,
    0.82435, 0.8251, 0.8273, 0.8308, 0.8356, 0.8493, 0.8676, 0.8901,
    0.80184, 0.8024, 0.8039, 0.8065, 0.8101, 0.8201, 0.8337, 0.8504,
    0.78363, 0.784,  0.7852, 0.7872, 0.7899, 0.7976, 0.8081, 0.8212,
    0.76834, 0.7687, 0.7696, 0.7712, 0.7733, 0.7794, 0.7878, 0.7983,
    0.75518, 0.7554, 0.7562, 0.7575, 0.7592, 0.7642, 0.7711, 0.7797,
    0.74364, 0.7438, 0.7445, 0.7455, 0.747,  0.7512, 0.7569, 0.7642,
    0.71982, 0.72,   0.7204, 0.7211, 0.7221, 0.725,  0.7289, 0.7339,
    0.70097, 0.7011, 0.7014, 0.7019, 0.7026, 0.7047, 0.7076, 0.7112,
    0.68545, 0.6855, 0.6858, 0.6861, 0.6867, 0.6883, 0.6905, 0.6932,
    0.67232, 0.6724, 0.6726, 0.6728, 0.6733, 0.6743, 0.6762, 0.6784,
    0.65099, 0.651,  0.6512, 0.6513, 0.6516, 0.6524, 0.6534, 0.6546,
    0.61397, 0.6141, 0.6143, 0.6145, 0.6147, 0.6148, 0.6148, 0.6147,
    0.5887, 0.5889, 0.5894, 0.59,   0.5903, 0.5901, 0.5895, 0.5885
};

// changed upper limit to 500 from 1.0e10  dgg 5/21/04
double MMCollisionInt::tstar[39] = {
    0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0,
    1.2, 1.4, 1.6, 1.8, 2.0, 2.5, 3.0, 3.5, 4.0,
    5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 12.0, 14.0, 16.0,
    18.0, 20.0, 25.0, 30.0, 35.0, 40.0, 50.0, 75.0, 100.0, 500.0
};

double MMCollisionInt::astar_table[39*8] = {
    1.0065, 1.0840, 1.0840, 1.0840, 1.0840, 1.0840, 1.0840, 1.0840,
    1.0231, 1.0660, 1.0380, 1.0400, 1.0430, 1.0500, 1.0520, 1.0510,
    1.0424, 1.0450, 1.0480, 1.0520, 1.0560, 1.0650, 1.0660, 1.0640,
    1.0719, 1.0670, 1.0600, 1.0550, 1.0580, 1.0680, 1.0710, 1.0710,
    1.0936, 1.0870, 1.0770, 1.0690, 1.0680, 1.0750, 1.0780, 1.0780,
    1.1053, 1.0980, 1.0880, 1.0800, 1.0780, 1.0820, 1.0840, 1.0840,
    1.1104, 1.1040, 1.0960, 1.0890, 1.0860, 1.0890, 1.0900, 1.0900,
    1.1114, 1.1070, 1.1000, 1.0950, 1.0930, 1.0950, 1.0960, 1.0950,
    1.1104, 1.1070, 1.1020, 1.0990, 1.0980, 1.1000, 1.1000, 1.0990,
    1.1086, 1.1060, 1.1020, 1.1010, 1.1010, 1.1050, 1.1050, 1.1040,
    1.1063, 1.1040, 1.1030, 1.1030, 1.1040, 1.1080, 1.1090, 1.1080,
    1.1020, 1.1020, 1.1030, 1.1050, 1.1070, 1.1120, 1.1150, 1.1150,
    1.0985, 1.0990, 1.1010, 1.1040, 1.1080, 1.1150, 1.1190, 1.1200,
    1.0960, 1.0960, 1.0990, 1.1030, 1.1080, 1.1160, 1.1210, 1.1240,
    1.0943, 1.0950, 1.0990, 1.1020, 1.1080, 1.1170, 1.1230, 1.1260,
    1.0934, 1.0940, 1.0970, 1.1020, 1.1070, 1.1160, 1.1230, 1.1280,
    1.0926, 1.0940, 1.0970, 1.0990, 1.1050, 1.1150, 1.1230, 1.1300,
    1.0934, 1.0950, 1.0970, 1.0990, 1.1040, 1.1130, 1.1220, 1.1290,
    1.0948, 1.0960, 1.0980, 1.1000, 1.1030, 1.1120, 1.1190, 1.1270,
    1.0965, 1.0970, 1.0990, 1.1010, 1.1040, 1.1100, 1.1180, 1.1260,
    1.0997, 1.1000, 1.1010, 1.1020, 1.1050, 1.1100, 1.1160, 1.1230,
    1.1025, 1.1030, 1.1040, 1.1050, 1.1060, 1.1100, 1.1150, 1.1210,
    1.1050, 1.1050, 1.1060, 1.1070, 1.1080, 1.1110, 1.1150, 1.1200,
    1.1072, 1.1070, 1.1080, 1.1080, 1.1090, 1.1120, 1.1150, 1.1190,
    1.1091, 1.1090, 1.1090, 1.1100, 1.1110, 1.1130, 1.1150, 1.1190,
    1.1107, 1.1110, 1.1110, 1.1110, 1.1120, 1.1140, 1.1160, 1.1190,
    1.1133, 1.1140, 1.1130, 1.1140, 1.1140, 1.1150, 1.1170, 1.1190,
    1.1154, 1.1150, 1.1160, 1.1160, 1.1160, 1.1170, 1.1180, 1.1200,
    1.1172, 1.1170, 1.1170, 1.1180, 1.1180, 1.1180, 1.1190, 1.1200,
    1.1186, 1.1190, 1.1190, 1.1190, 1.1190, 1.1190, 1.1200, 1.1210,
    1.1199, 1.1200, 1.1200, 1.1200, 1.1200, 1.1210, 1.1210, 1.1220,
    1.1223, 1.1220, 1.1220, 1.1220, 1.1220, 1.1230, 1.1230, 1.1240,
    1.1243, 1.1240, 1.1240, 1.1240, 1.1240, 1.1240, 1.1250, 1.1250,
    1.1259, 1.1260, 1.1260, 1.1260, 1.1260, 1.1260, 1.1260, 1.1260,
    1.1273, 1.1270, 1.1270, 1.1270, 1.1270, 1.1270, 1.1270, 1.1280,
    1.1297, 1.1300, 1.1300, 1.1300, 1.1300, 1.1300, 1.1300, 1.1290,
    1.1339, 1.1340, 1.1340, 1.1350, 1.1350, 1.1340, 1.1340, 1.1320,
    1.1364, 1.1370, 1.1370, 1.1380, 1.1390, 1.1380, 1.1370, 1.1350,
    1.14187, 1.14187, 1.14187, 1.14187, 1.14187, 1.14187, 1.14187,
    1.14187
};

double MMCollisionInt::bstar_table[39*8] = {
    1.1852, 1.2963, 1.2963, 1.2963, 1.2963, 1.2963,1.2963, 1.2963,
    1.1960,  1.216,  1.237,  1.269,  1.285,  1.290,  1.297,  1.294,
    1.2451,  1.257,  1.340,  1.389,  1.366,  1.327,  1.314,  1.278,
    1.2900,  1.294,  1.272,  1.258,  1.262,  1.282,  1.290,  1.299,
    1.2986,  1.291,  1.284,  1.278,  1.277,  1.288,  1.294,  1.297,
    1.2865,  1.281,  1.276,  1.272,  1.277,  1.286,  1.292,  1.298,
    1.2665,  1.264,  1.261,  1.263,  1.269,  1.284,  1.292,  1.298,
    1.2455,  1.244,  1.248,  1.255,  1.262,  1.278,  1.289,  1.296,
    1.2253,  1.225,  1.234,  1.240,  1.252,  1.271,  1.284,  1.295,
    1.2078,  1.210,  1.216,  1.227,  1.242,  1.264,  1.281,  1.292,
    1.1919,  1.192,  1.205,  1.216,  1.230,  1.256,  1.273,  1.287,
    1.1678,  1.172,  1.181,  1.195,  1.209,  1.237,  1.261,  1.277,
    1.1496,  1.155,  1.161,  1.174,  1.189,  1.221,  1.246,  1.266,
    1.1366,  1.141,  1.147,  1.159,  1.174,  1.202,  1.231,  1.256,
    1.1270,  1.130,  1.138,  1.148,  1.162,  1.191,  1.218,  1.242,
    1.1197,  1.122,  1.129,  1.140,  1.149,  1.178,  1.205,  1.231,
    1.1080,  1.110,  1.116,  1.122,  1.132,  1.154,  1.180,  1.205,
    1.1016,  1.103,  1.107,  1.112,  1.120,  1.138,  1.160,  1.183,
    1.0980,  1.099,  1.102,  1.106,  1.112,  1.127,  1.145,  1.165,
    1.0958,  1.097,  1.099,  1.102,  1.107,  1.119,  1.135,  1.153,
    1.0935,  1.094,  1.095,  1.097,  1.100,  1.109,  1.120,  1.134,
    1.0925,  1.092,  1.094,  1.095,  1.098,  1.104,  1.112,  1.122,
    1.0922,  1.092,  1.093,  1.094,  1.096,  1.100,  1.106,  1.115,
    1.0922,  1.092,  1.093,  1.093,  1.095,  1.098,  1.103,  1.110,
    1.0923,  1.092,  1.093,  1.093,  1.094,  1.097,  1.101,  1.106,
    1.0923,  1.092,  1.092,  1.093,  1.094,  1.096,  1.099,  1.103,
    1.0927,  1.093,  1.093,  1.093,  1.094,  1.095,  1.098,  1.101,
    1.0930,  1.093,  1.093,  1.093,  1.094,  1.094,  1.096,  1.099,
    1.0933,  1.094,  1.093,  1.094,  1.094,  1.095,  1.096,  1.098,
    1.0937,  1.093,  1.094,  1.094,  1.094,  1.094,  1.096,  1.097,
    1.0939,  1.094,  1.094,  1.094,  1.094,  1.095,  1.095,  1.097,
    1.0943,  1.094,  1.094,  1.094,  1.095,  1.095,  1.096,  1.096,
    1.0944,  1.095,  1.094,  1.094,  1.094,  1.095,  1.095,  1.096,
    1.0944,  1.094,  1.095,  1.094,  1.094,  1.095,  1.096,  1.096,
    1.0943,  1.095,  1.094,  1.094,  1.095,  1.095,  1.095,  1.095,
    1.0941,  1.094,  1.094,  1.094,  1.094,  1.094,  1.094,  1.096,
    1.0947,  1.095,  1.094,  1.094,  1.093,  1.093,  1.094,  1.095,
    1.0957,  1.095,  1.094,  1.093,  1.092,  1.093,  1.093,  1.094,
    1.10185, 1.10185, 1.10185, 1.10185, 1.10185, 1.10185, 1.10185,
    1.10185
};

double MMCollisionInt::cstar_table[39*8] = {
    0.8889,  0.77778, 0.77778,0.77778,0.77778,0.77778,0.77778,0.77778,
    0.88575, 0.8988, 0.8378, 0.8029, 0.7876, 0.7805, 0.7799, 0.7801,
    0.87268, 0.8692,0.8647,0.8479,0.8237,0.7975,0.7881,0.7784,
    0.85182, 0.8525,0.8366,0.8198,0.8054,0.7903,0.7839,0.782,
    0.83542, 0.8362,0.8306,0.8196,0.8076,0.7918,0.7842,0.7806,
    0.82629, 0.8278,0.8252,0.8169,0.8074,0.7916,0.7838,0.7802,
    0.82299, 0.8249,0.823,0.8165,0.8072,0.7922,0.7839,0.7798,
    0.82357, 0.8257,0.8241,0.8178,0.8084,0.7927,0.7839,0.7794,
    0.82657, 0.828,0.8264,0.8199,0.8107,0.7939,0.7842,0.7796,
    0.8311,  0.8234,0.8295,0.8228,0.8136,0.796,0.7854,0.7798,
    0.8363,  0.8366,0.8342,0.8267,0.8168,0.7986,0.7864,0.7805,
    0.84762, 0.8474,0.8438,0.8358,0.825,0.8041,0.7904,0.7822,
    0.85846, 0.8583,0.853,0.8444,0.8336,0.8118,0.7957,0.7854,
    0.8684,  0.8674,0.8619,0.8531,0.8423,0.8186,0.8011,0.7898,
    0.87713, 0.8755,0.8709,0.8616,0.8504,0.8265,0.8072,0.7939,
    0.88479, 0.8831,0.8779,0.8695,0.8578,0.8338,0.8133,0.799,
    0.89972, 0.8986,0.8936,0.8846,0.8742,0.8504,0.8294,0.8125,
    0.91028, 0.9089,0.9043,0.8967,0.8869,0.8649,0.8438,0.8253,
    0.91793, 0.9166,0.9125,0.9058,0.897,0.8768,0.8557,0.8372,
    0.92371, 0.9226,0.9189,0.9128,0.905,0.8861,0.8664,0.8484,
    0.93135, 0.9304,0.9274,0.9226,0.9164,0.9006,0.8833,0.8662,
    0.93607, 0.9353,0.9329,0.9291,0.924,0.9109,0.8958,0.8802,
    0.93927, 0.9387,0.9366,0.9334,0.9292,0.9162,0.905,0.8911,
    0.94149, 0.9409,0.9393,0.9366,0.9331,0.9236,0.9122,0.8997,
    0.94306, 0.9426,0.9412,0.9388,0.9357,0.9276,0.9175,0.9065,
    0.94419, 0.9437,0.9425,0.9406,0.938,0.9308,0.9219,0.9119,
    0.94571, 0.9455,0.9445,0.943,0.9409,0.9353,0.9283,0.9201,
    0.94662, 0.9464,0.9456,0.9444,0.9428,0.9382,0.9325,0.9258,
    0.94723, 0.9471,0.9464,0.9455,0.9442,0.9405,0.9355,0.9298,
    0.94764, 0.9474,0.9469,0.9462,0.945,0.9418,0.9378,0.9328,
    0.9479,  0.9478,0.9474,0.9465,0.9457,0.943,0.9394,0.9352,
    0.94827, 0.9481,0.948,0.9472,0.9467,0.9447,0.9422,0.9391,
    0.94842, 0.9484,0.9481,0.9478,0.9472,0.9458,0.9437,0.9415,
    0.94852, 0.9484,0.9483,0.948,0.9475,0.9465,0.9449,0.943,
    0.94861, 0.9487,0.9484,0.9481,0.9479,0.9468,0.9455,0.943,
    0.94872, 0.9486,0.9486,0.9483,0.9482,0.9475,0.9464,0.9452,
    0.94881, 0.9488,0.9489,0.949,0.9487,0.9482,0.9476,0.9468,
    0.94863, 0.9487,0.9489,0.9491,0.9493,0.9491,0.9483,0.9476,
    0.94444, 0.94444,0.94444,0.94444,0.94444,0.94444,0.94444,0.94444
};

void MMCollisionInt::init(double tstar_min, double tstar_max)
{
    m_nmin = -1;
    m_nmax = -1;

    for (int n = 0; n < 37; n++) {
        if (tstar_min > tstar[n+1]) {
            m_nmin = n;
        }
        if (tstar_max > tstar[n+1]) {
            m_nmax = n+1;
        }
    }
    if (m_nmin < 0 || m_nmin >= 36 || m_nmax < 0 || m_nmax > 36) {
        m_nmin = 0;
        m_nmax = 36;
    }
    m_logTemp.resize(37);

    for (int i = 0; i < 37; i++) {
        m_logTemp[i] = log(tstar[i+1]);
        vector<double> c(DeltaDegree+1);

        fitDelta(0, i, DeltaDegree, c.data());
        m_o22poly.push_back(c);

        fitDelta(1, i, DeltaDegree, c.data());
        m_apoly.push_back(c);

        fitDelta(2, i, DeltaDegree, c.data());
        m_bpoly.push_back(c);

        fitDelta(3, i, DeltaDegree, c.data());
        m_cpoly.push_back(c);
    }
}

double MMCollisionInt::fitDelta(int table, int ntstar, int degree, double* c)
{
    vector<double> w(8);
    double* begin = 0;
    switch (table) {
    case 0:
        begin = omega22_table + 8*ntstar;
        break;
    case 1:
        begin = astar_table + 8*(ntstar + 1);
        break;
    case 2:
        begin = bstar_table + 8*(ntstar + 1);
        break;
    case 3:
        begin = cstar_table + 8*(ntstar + 1);
        break;
    default:
        return 0.0;
    }
    w[0] = -1.0; // to activate weight values of unity
    return polyfit(8, degree, delta, begin, w.data(), c);
}

double MMCollisionInt::omega22(double ts, double deltastar)
{
    int i;
    for (i = 0; i < 37; i++) {
        if (ts < tstar22[i]) {
            break;
        }
    }
    int i1 = std::max(i - 1, 0);
    int i2 = i1+3;
    if (i2 > 36) {
        i2 = 36;
        i1 = i2 - 3;
    }
    vector<double> values(3);
    for (i = i1; i < i2; i++) {
        if (deltastar == 0.0) {
            values[i-i1] = omega22_table[8*i];
        } else {
            values[i-i1] = poly6(deltastar, m_o22poly[i].data());
        }
    }
    return quadInterp(log(ts), &m_logTemp[i1], values.data());
}

double MMCollisionInt::astar(double ts, double deltastar)
{
    int i;
    for (i = 0; i < 37; i++) if (ts < tstar22[i]) {
            break;
        }
    int i1 = std::max(i - 1, 0);
    int i2 = i1+3;
    if (i2 > 36) {
        i2 = 36;
        i1 = i2 - 3;
    }
    vector<double> values(3);
    for (i = i1; i < i2; i++) {
        if (deltastar == 0.0) {
            values[i-i1] = astar_table[8*(i + 1)];
        } else {
            values[i-i1] = poly6(deltastar, m_apoly[i].data());
        }
    }
    return quadInterp(log(ts), &m_logTemp[i1], values.data());
}

double MMCollisionInt::bstar(double ts, double deltastar)
{
    int i;
    for (i = 0; i < 37; i++) if (ts < tstar22[i]) {
            break;
        }
    int i1 = std::max(i - 1, 0);
    int i2 = i1+3;
    if (i2 > 36) {
        i2 = 36;
        i1 = i2 - 3;
    }
    vector<double> values(3);
    for (i = i1; i < i2; i++) {
        if (deltastar == 0.0) {
            values[i-i1] = bstar_table[8*(i + 1)];
        } else {
            values[i-i1] = poly6(deltastar, m_bpoly[i].data());
        }
    }
    return quadInterp(log(ts), &m_logTemp[i1], values.data());
}

double MMCollisionInt::cstar(double ts, double deltastar)
{
    int i;
    for (i = 0; i < 37; i++) if (ts < tstar22[i]) {
            break;
        }
    int i1 = std::max(i - 1,0);
    int i2 = i1+3;
    if (i2 > 36) {
        i2 = 36;
        i1 = i2 - 3;
    }
    vector<double> values(3);
    for (i = i1; i < i2; i++) {
        if (deltastar == 0.0) {
            values[i-i1] = cstar_table[8*(i + 1)];
        } else {
            values[i-i1] = poly6(deltastar, m_cpoly[i].data());
        }
    }
    return quadInterp(log(ts), &m_logTemp[i1], values.data());
}

void MMCollisionInt::fit_omega22(int degree, double deltastar, double* o22)
{
    int n = m_nmax - m_nmin + 1;
    vector<double> values(n);
    vector<double> w(n);
    double* logT = &m_logTemp[m_nmin];
    for (int i = 0; i < n; i++) {
        if (deltastar == 0.0) {
            values[i] = omega22_table[8*(i + m_nmin)];
        } else {
            values[i] = poly6(deltastar, m_o22poly[i+m_nmin].data());
        }
    }
    w[0]= -1.0;
    polyfit(n, degree, logT, values.data(), w.data(), o22);
}

void MMCollisionInt::fit(int degree, double deltastar, double* a, double* b, double* c)
{
    int n = m_nmax - m_nmin + 1;
    vector<double> values(n);
    vector<double> w(n);
    double* logT = &m_logTemp[m_nmin];
    for (int i = 0; i < n; i++) {
        if (deltastar == 0.0) {
            values[i] = astar_table[8*(i + m_nmin + 1)];
        } else {
            values[i] = poly6(deltastar, m_apoly[i+m_nmin].data());
        }
    }
    w[0]= -1.0;
    polyfit(n, degree, logT, values.data(), w.data(), a);

    for (int i = 0; i < n; i++) {
        if (deltastar == 0.0) {
            values[i] = bstar_table[8*(i + m_nmin + 1)];
        } else {
            values[i] = poly6(deltastar, m_bpoly[i+m_nmin].data());
        }
    }
    w[0]= -1.0;
    polyfit(n, degree, logT, values.data(), w.data(), b);

    for (int i = 0; i < n; i++) {
        if (deltastar == 0.0) {
            values[i] = cstar_table[8*(i + m_nmin + 1)];
        } else {
            values[i] = poly6(deltastar, m_cpoly[i+m_nmin].data());
        }
    }
    w[0]= -1.0;
    polyfit(n, degree, logT, values.data(), w.data(), c);
}

} // namespace
